package cn.xenosp.server.module.weixin.service.impl;

import cn.xenosp.server.common.cache.Cache;
import cn.xenosp.server.module.weixin.service.IWeiXinRepository;
import org.apache.commons.lang3.RandomStringUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Repository;

import javax.annotation.Resource;
import java.util.concurrent.TimeUnit;

/**
 * 项目名： service-web
 * 包路径： cn.xenosp.server.module.weixin.service.impl
 * 作者：   TongHui
 * 创建时间: 2025-11-12 11:28
 * 描述: TODO
 * 版本: 1.0
 */
@Repository
public class WeiXinRepository implements IWeiXinRepository {

    private static final String Key = "weixin_code";

    @Resource
    private Cache cache;

    @Override
    public String genCode(String openId) {
        // 获取值
        String isExitCode = (String) cache.get(Key + "_" + openId);
        if (StringUtils.isNotBlank(isExitCode)) return isExitCode;
        // 生成值
//        RLock lock = redisService.getLock(Key);
        try {
//            lock.lock(15, TimeUnit.SECONDS);

            String code = RandomStringUtils.randomNumeric(4);
            // 防重校验&重新生成
            for (int i = 0; i < 10 && StringUtils.isNotBlank(cache.get(Key + "_" + code).toString()); i++) {
                if (i < 3) {
                    code = RandomStringUtils.randomNumeric(4);
                } else if (i < 5) {
                    code = RandomStringUtils.randomNumeric(5);
                } else if (i < 9) {
                    code = RandomStringUtils.randomNumeric(6);
//                    log.warn("验证码重复，生成6位字符串验证码 {} {}", openId, code);
                } else {
                    return "您的验证码获取失败，请重新回复405获取。";
                }
            }

            // 存储值【3分钟有效期】
            cache.set(Key + "_" + code, openId, 3 * 60 * 1000);
            cache.set(Key + "_" + openId, code, 3 * 60 * 1000);

            return code;
        } finally {
//            lock.unlock();
        }
    }

}
